/*
 * matrices.h
 *
 *  Created on: Oct 8, 2012
 *      Author: hammer
 */

class Fmatrix {
	int M,N;
	vector < vector<float> > mat;
public:
	int width();
	int height();
	float get(int i,int j);
	void set(int i,int j,float value);
	Fmatrix(int m,int n);
	Fmatrix(int m,int n,float value);
	Fmatrix operator* (Fmatrix);
	vector<float> operator* (vector<float>);
	void print();
};

float Fmatrix::get(int i,int j) {
	return mat[i][j];
}

void Fmatrix::set(int i,int j, float value) {
	mat[i][j]=value;
}

int Fmatrix::width() {
	return N;
}

int Fmatrix::height() {
	return M;
}

Fmatrix::Fmatrix(int m,int n) {
	int i;
	M=m;
	N=n;
	mat.resize(M);
	for (i=0;i<M;i++) {
		mat[i].resize(N);
	}
}

Fmatrix::Fmatrix(int m,int n,float value) {
	int i;
	M=m;
	N=n;
	mat.resize(M);
	for (i=0;i<M;i++) {
		mat[i].resize(N,value);
	}
}

Fmatrix Fmatrix::operator *(Fmatrix mat1) {
	int i,j,k,m,n;
	m=height();
	n=mat1.width();
	Fmatrix temp_mat(m,n,0);
	for (i=0;i<m;i++) {
		for (j=0;j<n;j++) {
			for (k=0;k<M;k++) {
				temp_mat.set(i,j,temp_mat.get(i,j)+get(i,k)*mat1.get(k,j));
			}
		}
	}
	return temp_mat;
}

vector <float> Fmatrix::operator *(vector <float> vec) {
	int i,j;
	vector <float> temp_vec;
	temp_vec.resize(M,0);
	for (i=0;i<M;i++) {
		for (j=0;j<N;j++) {
			temp_vec[i]=temp_vec[i]+vec[j]*get(i,j);
		}
	}
	return temp_vec;
}

void Fmatrix::print() {
	int i,j;
	for (i=0;i<M;i++) {
		for (j=0;j<N;j++) {
			cout << mat[i][j] << "\t";
		}
		cout << "\n";
	}
}
